;*********************************************************************************************
;*                    * THIS PROGRAM WILL SCROLL THE PC DATA ON 12 PIECES *		     *
;*********************************************************************************************

BUFFER EQU 30H
FADDR EQU 0A0H		; FIXED ADDRESS FOR AT24CXX EEPROMS FAMILY
BLOCK1 EQU 0H		; PROGRAMMABLE MEMORY BLOCK ADDRESS (0..7)
BLOCK2 EQU 1H	
BLOCK3 EQU 2H	
BLOCK4 EQU 3H	


SCL BIT P3.6		;SERIAL CLOCK INOUT
SDA BIT P3.7		;SERIAL DATA

ORG 0000H	 	; RESET INTERRUPT
JMP MAIN

ORG 0023H		; SERIAL COMMUNICATION INTERRUPT
JMP SERIAL			 

MAIN:
MOV R0,#0FFH         	; CLEAR ALL RAM LOCATION
ZERO:
MOV @R0,#00H
DJNZ R0,ZERO
MOV TMOD,#20H       	; TIMER MODE
MOV SCON,#50H
MOV TH1,#0FDH       	; BAUD RATE 9600 WITH 11.0592 MHZ
MOV TL1,#0FDH
SETB TR1
MOV IE,#90H		; INTERRUPT ENABLEING FOR SERIAL COMMUNICATION
MOV R1,#37H
A2:
MOV R7,#BLOCK4
MOV 31H,#10H
MOV BUFFER,#00D
MOV A,R7
CALL WRITE_BYTE
JC A2
MOV 31H,#00D
MOV R7,#BLOCK1
SETB F0      
BAK:
JNB F0,$
CHECK:
CALL READING
CALL RESET
JMP BAK


;*********************************************************************************************
;*               * WRITE 170 BYTES SEQUENTIALY HAVING VALUE 80H AT THE START *		     *
;*********************************************************************************************


WRITE_60:
MOV BUFFER,#80H		; 60 SPACES IN START
MOV B,#120D		; RETRY COUNTER IN CASE OF FAILURE
MOV 31H,#00H		; SETUP ADDRESSES
X52:
MOV A,R7	        ; PROGRAMMABLE PAGE ADDRESS
CALL WRITE_BYTE		; WRITE BYTE
CALL DELAY_5ms
JNC X53
DJNZ B,X52		; OK OR NOT OK
SETB C			; SET CARRY
JMP X54
X53:
INC 31H
MOV A,31H
CJNE A,#60D,X52
CLR C
X54:
RET


;*********************************************************************************************
;*               * WRITE 170 BYTES SEQUENTIALY HAVING VALUE 80H AT THE END *		      *
;*********************************************************************************************


WRITE_60_END:
MOV BUFFER,#80H		 ; WRITE VALUE 80H
MOV B,#60D		 ; LAST 60 SPACES
X82:
MOV A,R7	         ; PROGRAMMABLE PAGE ADDRESS
CALL WRITE_BYTE		 ; WRITE BYTE
CALL DELAY_5ms
JNC X83
JMP X82			 ; OK OR NOT OK
SETB C			 ; SET CARRY
JMP X84
X83:
CALL INCREMENT
JNC X
INC 32H
MOV A,32H
CALL BLOCK		 ;CALCULATE R7=PAGE ADDRESS
CLR C
X:
DJNZ B,X82
CLR C
X84:
RET


READING:
MOV 33H,#00H
CALL READ_BLOCK
RET


;*********************************************************************************************
;*                    * READ FROM EEPROM AND SELECTION OF MEMORY BLOCK *		     *
;*********************************************************************************************


READ_BLOCK:
; READ FROM ONE BYTE TO ONE PAGE OF DATA FROM AN AT24C16A.
; PERFORMS A RANDOM READ WHICH IS EXTENDED INTO A SEQUENTIAL READ
; WHEN MORE THAN ONE BYTE IS READ. CALLED WITH PROGRAMMABLE ADDRESS
; IN A, ADDRESS OF FIRST BYTE AT ADDRESS 33H.
; RETURNS DATA AT PORT. RETURNS CY SET TO INDICATE THAT THE BUS IS
; NOT AVAILABLE OR THAT THE ADDRESSED DEVICE FAILED TO ACKNOWLEDGE.

; SEND DUMMY WRITE COMMAND TO ADDRESS FIRST BYTE.

CLR C
MOV R7,#BLOCK1
NEXT_60:
CALL START
JC X35		            	; ABORT IF BUS NOT AVAILABLE
MOV A,R7
RL A		    		; PROGRAMMABLE ADDRESS TO BITS 3:1
ORL A,#FADDR			; ADD FIXED ADDRESS
MOV BUFFER,A			; SAVE COPY OF DEVICE ADDRESS
CLR ACC.0			; SPECIFY WRITE OPERATION
CALL SHOUT			; SEND DEVICE ADDRESS
JC X34		    		; ABORT IF NO ACKNOWLEDGE

MOV A,33H	    		; SEND LOW BYTE OF ADDRESS
CALL SHOUT			;
JC X34		    		; ABORT IF NO ACKNOWLEDGE

		        	; SEND READ COMMAND AND RECEIVE DATA.
CALL START			; SECOND START FOR READ
JC X34		    		; ABORT IF BUS NOT AVAILABLE

MOV A,BUFFER			; GET DEVICE ADDRESS
SETB ACC.0			; SPECIFY READ OPERATION
CALL SHOUT			; SEND DEVICE ADDRESS
JC X34	     			; ABORT IF NO ACKNOWLEDGE
		    
X31:
CALL SHIN			; RECEIVE DATA BYTE
JNZ DISPLAY
CALL NAK			; DO NOT ACKNOWLEDGE LAST BYTE
CLR C
X34:
CALL STOP
X35:
RET


;*********************************************************************************************
;*                         * SEND DATA ON PORT 2 READED FROM EEPROM *			     *
;*********************************************************************************************


DISPLAY:
JB F0,X3
MOV P2,#00H
MOV P1,#00H
JMP X35
X3:				   
MOV P2,A				 ; READED DATA
MOV P1,R6				 ; DECODING OUTPUT
INC R6
CALL DELAY
CJNE R6,#60D,NLB		 	 ; CHECK FOR 12 PIECES
CALL NAK				 ; NO ACKNOWLEDGE
CLR C
CALL STOP				 ; STOP CONDITION
MOV A,33H				 ; NEXT ADDRESS
ADD A,#1D
MOV 33H,A
JNZ NEXT_PAGE
INC 34H
MOV A,34H
CALL BLOCK 				 ; CALCULATE MEMORY PAGE
NEXT_PAGE:	  
MOV R6,#00D
JMP NEXT_60

NLB:
CALL ACK
JMP X31


;*********************************************************************************************
;*                           * START CONDITION FOR EEPROM *				     *
;*********************************************************************************************


START:
; SEND START, DEFINED AS HIGH-TO-LOW SDA WITH SCL HIGH.
; RETURN WITH SCL, SDA LOW.
; RETURNS CY SET IF BUS IS NOT AVAILABLE.

SETB SDA
SETB SCL

; VERIFY BUS AVAILABLE.

JNB SDA,X40	             ; JUMP IF NOT HIGH
JNB SCL,X40	             ; JUMP IF NOT HIGH
NOP			     ; ENFORCE SETUP DELAY AND CYCLE DELAY
CLR SDA
NOP		             ; ENFORCE HOLD DELAY
NOP			     ;
NOP			     ;
NOP			     ;
NOP			     ;
CLR SCL

CLR C		             ; CLEAR ERROR FLAG
JMP X41
X40:
SETB C	                     ; SET ERROR FLAG
X41:
RET



;*********************************************************************************************
;*                              * STOP CONDITION FOR EEPROM *				     *
;*********************************************************************************************



STOP:
; SEND STOP, DEFINED AS LOW-TO-HIGH SDA WITH SCL HIGH.
; SCL EXPECTED LOW ON ENTRY. RETURN WITH SCL, SDA HIGH.

CLR	SDA
NOP			             ; ENFORCE SCL LOW AND DATA SETUP
NOP
SETB SCL
NOP			             ; ENFORCE SETUP DELAY
NOP			             ;
NOP			             ;
NOP		                     ;
NOP			             ;
SETB SDA
RET



;*********************************************************************************************
;*                        * DATA BYTE TRANSFOR FROM CONTROLLER TO EEPROM *		     *
;*********************************************************************************************



SHOUT:

; SHIFT OUT A BYTE TO THE AT24C16, MOST SIGNIFICANT BIT FIRST.
; SCL, SDA EXPECTED LOW ON ENTRY. RETURN WITH SCL LOW.
; CALLED WITH DATA TO SEND IN A.
; RETURNS CY SET TO INDICATE FAILURE BY SLAVE TO ACKNOWLEDGE.
; DESTROYS A.

PUSH B
MOV B,#8	            	; BIT COUNTER
X42:
RLC A		            	; MOVE BIT INTO CY
MOV SDA,C		        ; OUTPUT BIT
NOP			        ; ENFORCE SCL LOW AND DATA SETUP
SETB SCL		        ; RAISE CLOCK
NOP			        ; ENFORCE SCL HIGH
NOP			        ;
NOP			        ;
NOP			        ;
CLR SCL		            	; DROP CLOCK
DJNZ B,X42	            	; NEXT BIT
SETB SDA		        ; RELEASE SDA FOR ACK
NOP			        ; ENFORCE SCL LOW AND TAA
NOP			        ;
SETB SCL		        ; RAISE ACK CLOCK
NOP			        ; ENFORCE SCL HIGH
NOP			        ;
NOP			        ;
NOP			        ;
MOV C,SDA		        ; GET ACK BIT
CLR SCL		            	; DROP ACK CLOCK
POP B
RET



;*********************************************************************************************
;*                        * DATA BYTE TRANSFOR FROM EEPROM TO CONTROLLER *		     *
;*********************************************************************************************



SHIN:
; SHIFT IN A BYTE FROM THE AT24CXX, MOST SIGNIFICANT BIT FIRST.
; SCL EXPECTED LOW ON ENTRY. RETURN WITH SCL LOW.
; RETURNS RECEIVED DATA BYTE IN A.

SETB SDA	             	; MAKE SDA AN INPUT
PUSH B
MOV B,#8	             	; BIT COUNT
X43:
NOP			        ; ENFORCE SCL LOW AND DATA SETUP
NOP			        ;
NOP			        ;
SETB SCL                 	; RAISE CLOCK
NOP			        ; ENFORCE SCL HIGH
NOP			        ;
MOV C,SDA		        ; INPUT BIT
RLC A		             	; MOVE BIT INTO BYTE
CLR SCL		             	; DROP CLOCK
DJNZ B,X43		        ; NEXT BIT
POP B
RET



;*********************************************************************************************
;*                       * ACKNOWLEDGEMENT FOR EEPROM TO GET NEXT BYTE *		     *
;*********************************************************************************************


ACK:
; CLOCK OUT AN ACKNOWLEDGE BIT (LOW).
; SCL EXPECTED LOW ON ENTRY. RETURN WITH SCL, SDA LOW.

CLR SDA		            	; ACK BIT
NOP				; ENFORCE SCL LOW AND DATA SETUP
NOP				;
SETB SCL			; RAISE CLOCK
NOP				; ENFORCE SCL HIGH
NOP				;
NOP				;
NOP				;
CLR SCL				; DROP CLOCK
RET



;*********************************************************************************************
;*                     * NO ACKNOWLEDGEMENT FOR EEPROM TO GET NEXT BYTE *		     *
;*********************************************************************************************



NAK:
; CLOCK OUT A NEGATIVE ACKNOWLEDGE BIT (HIGH).
; SCL EXPECTED LOW ON ENTRY. RETURN WITH SCL LOW, SDA HIGH.

SETB SDA				; NAK BIT
NOP					; ENFORCE SCL LOW AND DATA SETUP
NOP					;
SETB SCL				; RAISE CLOCK
NOP					; ENFORCE SCL HIGH
NOP					;
NOP					;
NOP					;
CLR SCL					; DROP CLOCK
RET
					 


;*********************************************************************************************
;*                          * SERIAL DATA INTERRUPT ROUTINE *				     *
;*********************************************************************************************



SERIAL:
MOV A,SBUF				 ; SAVE DATA IN ACCUMULATOR
MOV @R1,A				 ; SAVE IT AT MEMORY LOCATION
JNZ NEXT				 ; CHECK FOR END OF STRING
MOV R0,#37H				 ; RESET VALUES
MOV R1,#37H
MOV R7,#BLOCK1
CALL STOP
CALL RESET
CALL DELAY_5ms
CALL STOP
CALL WRITE_60			 	; 60 BYTES WRITE TO EEPROM HAVING VALUE 80H
CALL WRITE_DATA			 	; WRITE WHOLE STRING TO EEPROM
CLR RI					; CLEAR RECIEVE INTERRUPT
SETB F0 				; CHECK FLAG FOR DECISION
RETI
NEXT:
INC R1					; NEXT LOCATION FOR BYTE SAVED COMING FROM PC
CLR RI
CLR F0 
RETI



;*********************************************************************************************
;*                                * CALCULATION FOR DPTR *				     *
;*********************************************************************************************



RECOG:					 
MOV R2,A				 ; CHARACTER COME FROM PC
ANL A,#0F0H				 ; SPLIT BYTE
SWAP A					 ; SWAP BYTE
MOV R3,A				 ; SAVE RESULT IN R3
MOV A,R2				 ; CHARACTER COME FROM PC
ANL A,#0FH				 ; SPLIT BYTE
MOV R2,A				 ; SAVE RESULT IN R2

NEXT6:
CJNE R3,#2D,NEXT1		 	 ; GET SUITABLE VALUE OF DPTR ACCORDING TO CHARACTER 
MOV DPTR,#TABLE1
RET

NEXT1:
CJNE R3,#3D,NEXT2		 	 ;
MOV DPTR,#TABLE2
RET

NEXT2:
CJNE R3,#4D,NEXT3		 	 ;
MOV DPTR,#TABLE3
RET

NEXT3:
CJNE R3,#5D,NEXT4		 	 ;
MOV DPTR,#TABLE4
RET

NEXT4:
CJNE R3,#6D,NEXT5		 	 ;
MOV DPTR,#TABLE5
RET

NEXT5:
CJNE R3,#7D,NEXT6		 	 ;
MOV DPTR,#TABLE6
RET


;*********************************************************************************************
;*                            * CALCULATION FOR ACCUMULATOR *				     *
;*********************************************************************************************


CALCUL:					 ; GET SUITABLE VALUE OF A FOR COPYING BYTES FROM ROM
CLR A
BACK:
ADD A,#06D
DJNZ R2,BACK
RET


;*********************************************************************************************
;*                              * DATA WRITTEN AT EEPROM *				     *
;*********************************************************************************************


WRITE_DATA:
MOV R0,#37H				 ; GET CHARACTER FROM ROM TO WRITE AT EEPROM
BACKWARD:
MOV A,@R0				 ; COPY IT IN A
JNZ SAVE
CALL WRITE_60_END		 	 ; LAST 60 BYTES
A1:
MOV BUFFER,#0D
MOV A,R7				 ; WRITE 0 TO EEPROM AT THE END OF A STRING
CALL WRITE_BYTE			 	 ; WRITE BYTE
CALL DELAY_5ms			 	 ; WRITE TIME CYCLE
JC A1 
MOV R0,#37H
RET
SAVE:
CALL RECOG				 ; SUITABLE DPTR
CALL CALCUL				 ; SUITABLE A

MOV R4,#6D				 ; NO OF BYTES TO BE WRITTEN
MOV R5,A				 ; VALUE OF A AFTER CALL CALCUL
REVERSE:
MOV A,R5
MOVC A,@A+DPTR			 	 ; GET BYTE FROM ROM
MOV BUFFER,A
MOV A,R7
CALL WRITE_BYTE			 	 ; WRITE DATA BYTE
CALL DELAY_5ms
JC REVERSE
CALL INCREMENT			  	 ; NEXT LOCATION WHERE NEXT BYTE HAS TO BE WRITTEN IN EEPROM
JNC ADDRESS
INC 32H
MOV A,32H
CALL BLOCK				 ; SUITABLE PAGING ADDRESS
CLR C
ADDRESS:
INC R5
DJNZ R4,REVERSE			 	 ; DECREMENT COUNTER FOR NO OF BYTES
INC R0					 ; NEXT ORIGINAL DATA BYTE COMING FROM PC
JMP BACKWARD


;*********************************************************************************************
;*                             * INCREMENT TO NEXT LOCATION *				     *
;*********************************************************************************************


INCREMENT:				 ; NEXT LOCATION
MOV A,31H				 ;
ADD A,#1D				 ;
MOV 31H,A				 ;
RET


;*********************************************************************************************
;*                             * CALCULATION FOR MEMORY BLOCKS *			     *
;*********************************************************************************************


BLOCK:				 ; SUITABLE VALUE OF R7 FOR MEMORY BLOCKS OF EEPROM
CJNE A,#1D,B1
MOV R7,#BLOCK2
RET
B1:
CJNE A,#2D,B2			 ;
MOV R7,#BLOCK3
RET
B2:
CJNE A,#3D,B0			 ;
MOV R7,#BLOCK4
MOV 32H,#00D
RET

B0:
RET


;*********************************************************************************************
;*                               * BYTE WRITE TO EEPROM *				     *
;*********************************************************************************************


WRITE_BYTE:
CALL START
JC X49		    		 ; ABORT IF BUS NOT AVAILABLE

RL A		    		 ; PROGRAMMABLE ADDRESS TO BITS 3:1
ORL A,#FADDR    		 ; ADD FIXED ADDRESS
CLR ACC.0				 ; SPECIFY WRITE OPERATION
CALL SHOUT	    		 ; SEND DEVICE ADDRESS
JC X48		    		 ; ABORT IF NO ACKNOWLEDGE

MOV A,31H	    		 ; SEND LOW BYTE OF ADDRESS
CALL SHOUT				 ;
JC X48		    		 ; ABORT IF NO ACKNOWLEDGE

MOV A,BUFFER			 ; GET DATA
CALL SHOUT				 ; SEND DATA
JC X48		    		 ; ABORT IF NO ACKNOWLEDGE

CLR C	     			 ; CLEAR ERROR FLAG
X48:
CALL STOP
X49:
RET



;*********************************************************************************************
;*                       * RESET REGISTER VALUES BEFORE NEXT UPDATION *			     *
;*********************************************************************************************



RESET:
MOV BUFFER,#00D			 ; RESET VALUES BEFORE NEXT CYCLE
MOV 31H,#00D
MOV 32H,#00D
MOV 33H,#00D
MOV 34H,#00D
MOV R6,#00D
RET


;*********************************************************************************************
;*                           * DELAY FOR REFRESHING DISPLAY  *				     *
;*********************************************************************************************


DELAY: 					 ; DELAY FOR DISPLAY
MOV 35H,#7D				 
DL1:
MOV 36H,#25D
DJNZ 36H,$
DJNZ 35H,DL1
RET



;*********************************************************************************************
;*                        * 5 MILLISECOND DELAY FOR EEPROM WRITE TIME CYCLE *		     *
;*********************************************************************************************



DELAY_5ms: 				 ; 5ms DELAY FOR EEPROM WRITE CYCLE
MOV 35H,#23D
DL:
MOV 36H,#100D
DJNZ 36H,$
DJNZ 35H,DL
RET


;*********************************************************************************************
;*                           * LOOK UP TABLE FOR CHARACTERS *				     *
;*********************************************************************************************



ORG 300H
TABLE1:

 DB 80H,80H,80H,80H,80H,80H	 ; SPACE
 DB 80H,80H,5FH,80H,80H,80H	 ; !
 DB 04H,02H,05H,02H,01H,80H	 ; "
 DB 14H,7FH,14H,7FH,14H,80H	 ; # 
 DB 26H,49H,7FH,49H,32H,80H	 ; $
 DB 22H,10H,08H,04H,22H,80H	 ; %
 DB 80H,36H,49H,36H,28H,80H	 ; &
 DB 04H,02H,01H,80H,80H,80H	 ; '
 DB 08H,14H,22H,41H,80H,80H	 ; (
 DB 80H,41H,22H,14H,08H,80H	 ; )
 DB 2AH,1CH,08H,1CH,2AH,80H	 ; *
 DB 08H,08H,3EH,08H,08H,80H	 ; +
 DB 80H,58H,38H,80H,80H,80H	 ; ,
 DB 08H,08H,08H,08H,08H,80H	 ; -
 DB 40H,80H,80H,80H,80H,80H	 ; .
 DB 20H,10H,08H,04H,02H,80H	 ; /

TABLE2:

 DB 3EH,41H,41H,41H,3EH,80H  	 ; 0	 
 DB 80H,42H,0FFH,40H,80H,80H 	 ; 1 
 DB 42H,61H,51H,49H,46H,80H	 ; 2	
 DB 49H,49H,49H,49H,36H,80H	 ; 3
 DB 07H,08H,08H,08H,77H,80H	 ; 4
 DB 4FH,49H,49H,49H,39H,80H  	 ; 5 
 DB 3EH,49H,49H,49H,32H,80H  	 ; 6	 
 DB 41H,21H,11H,09H,07H,80H	 ; 7
 DB 3EH,49H,49H,49H,3EH,80H	 ; 8
 DB 06H,09H,09H,09H,7EH,80H	 ; 9
 DB 80H,80H,22H,80H,80H,80H	 ; :
 DB 80H,40H,32H,80H,80H,80H	 ; ;
 DB 08H,14H,22H,41H,80H,80H	 ; <
 DB 14H,14H,14H,14H,14H,80H	 ; =
 DB 80H,41H,22H,14H,08H,80H	 ; >
 DB 06H,01H,51H,09H,06H,80H  	 ; ?

TABLE3:

 DB 3EH,4DH,53H,1DH,1EH,80H  	 ; @
 DB 7CH,12H,11H,12H,7CH,80H   	 ; A
 DB 7FH,49H,49H,49H,36H,80H	 ; B
 DB 3EH,41H,41H,41H,22H,80H	 ; C
 DB 7FH,41H,41H,22H,1CH,80H	 ; D
 DB 7FH,49H,49H,49H,41H,80H	 ; E
 DB 7FH,09H,09H,09H,01H,80H	 ; F
 DB 3EH,41H,49H,49H,7AH,80H	 ; G
 DB 7FH,08H,08H,08H,7FH,80H	 ; H
 DB 80H,41H,7FH,41H,80H,80H	 ; I
 DB 20H,40H,41H,3FH,01H,80H	 ; J
 DB 7FH,08H,14H,22H,41H,80H	 ; K
 DB 7FH,40H,40H,40H,40H,80H	 ; L
 DB 7FH,02H,0CH,02H,7FH,80H	 ; M
 DB 7FH,04H,08H,10H,7FH,80H	 ; N
 DB 3EH,41H,41H,41H,3EH,80H	 ; O

TABLE4:
	 
 DB 7FH,09H,09H,09H,06H,80H  	 ; P	 
 DB 3EH,41H,51H,21H,5EH,80H	 ; Q
 DB 7FH,09H,19H,29H,46H,80H	 ; R
 DB 46H,49H,49H,49H,31H,80H  	 ; S	
 DB 01H,01H,7FH,01H,01H,80H	 ; T
 DB 3FH,40H,40H,40H,3FH,80H	 ; U
 DB 1FH,20H,40H,20H,1FH,80H	 ; V
 DB 3FH,40H,30H,40H,3FH,80H	 ; W
 DB 63H,14H,08H,14H,63H,80H	 ; X
 DB 07H,08H,70H,08H,07H,80H	 ; Y
 DB 61H,51H,49H,45H,43H,80H	 ; Z
 DB 7FH,41H,41H,41H,80H,80H	 ; [
 DB 02H,04H,08H,10H,40H,80H	 ; "\"
 DB 80H,41H,41H,41H,7FH,80H	 ; ]
 DB 04H,02H,01H,02H,04H,80H	 ; ^
 DB 40H,40H,40H,40H,40H,80H	 ; _

TABLE5:

 DB 01H,02H,04H,80H,80H,80H  	 ; '
 DB 7CH,12H,11H,12H,7CH,80H  	 ; A
 DB 7FH,49H,49H,49H,36H,80H	 ; B
 DB 3EH,41H,41H,41H,22H,80H	 ; C
 DB 7FH,41H,41H,22H,1CH,80H	 ; D
 DB 7FH,49H,49H,49H,41H,80H	 ; E
 DB 7FH,09H,09H,09H,01H,80H	 ; F
 DB 3EH,41H,49H,49H,7AH,80H	 ; G
 DB 7FH,08H,08H,08H,7FH,80H	 ; H
 DB 80H,41H,7FH,41H,80H,80H	 ; I
 DB 20H,40H,41H,3FH,01H,80H	 ; J
 DB 7FH,08H,14H,22H,41H,80H	 ; K
 DB 7FH,40H,40H,40H,40H,80H	 ; L
 DB 7FH,02H,0CH,02H,7FH,80H	 ; M
 DB 7FH,04H,08H,10H,7FH,80H	 ; N
 DB 3EH,41H,41H,41H,3EH,80H	 ; O

 TABLE6:

 DB 7FH,09H,09H,09H,06H,80H  	 ; P	 
 DB 3EH,41H,51H,21H,5EH,80H	 ; Q
 DB 7FH,09H,19H,29H,46H,80H	 ; R
 DB 46H,49H,49H,49H,31H,80H  	 ; S	
 DB 01H,01H,7FH,01H,01H,80H	 ; T
 DB 3FH,40H,40H,40H,3FH,80H	 ; U
 DB 1FH,20H,40H,20H,1FH,80H	 ; V
 DB 3FH,40H,30H,40H,3FH,80H	 ; W
 DB 63H,14H,08H,14H,63H,80H	 ; X
 DB 07H,08H,70H,08H,07H,80H	 ; Y
 DB 61H,51H,49H,45H,43H,80H	 ; Z
 DB 77H,49H,41H,41H,80H,80H	 ; {
 DB 80H,80H,77H,80H,80H,80H	 ; |
 DB 80H,41H,41H,49H,77H,80H	 ; }
 DB 04H,02H,04H,02H,80H,80H	 ; ~

END